package jp.co.neosystem.adwg.neodiary.db.util;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import android.database.sqlite.SQLiteDatabase;

/**
 * OrderByマップクラス
 * 
 * @author NEOSystem
 */
public class OrderByMap
{
	/**
	 * ソート種別
	 */
	public enum SortKind
	{
		ASC, DESC
	}

	/** OrderByマップ */
	private Map<String, SortKind> orderByMap = new LinkedHashMap<String, SortKind>();

	/**
	 * ソート対象設定
	 * 
	 * <pre>
	 * 引数の何れかがnull、または空だった場合、OrderByマップへの設定は行わない
	 * </pre>
	 * 
	 * @param column ソート対象カラム
	 * @param sortKind ソート種別
	 */
	public void put(String column, SortKind sortKind)
	{
		if (StringUtils.isEmpty(column) || sortKind == null)
		{
			return;
		}
		
		orderByMap.put(column, sortKind);
	}

	/**
	 * ソート対象取得
	 * 
	 * @param colmun ソート対象カラム
	 * @return ソート種別
	 */
	public SortKind get(String colmun)
	{
		return orderByMap.get(colmun);
	}

	/**
	 * OrderBy句を取得
	 * 
	 * <pre>
	 * OrderByマップの内容よりOrderBy句を作成し、それを戻り値とする。
	 * 例えば、カラム「aaa (昇順)」、「bbb (降順)」、「ccc (昇順)」がマップに設定されていた場合、
	 * 
	 * aaa ASC, bbb DESC, ccc ASC
	 * 
	 * という文字列が戻り値となる。
	 * 
	 * {@link SQLiteDatabase#query}のOrderBy対象カラムを指定する引数にて利用するため、
	 * 接頭辞 (ORDER BY) は付与していない。
	 * 
	 * </pre>
	 * 
	 * return OrderBy句
	 */
	public String getOrderBy()
	{
		int entrySetSize = orderByMap.entrySet().size();
		if (entrySetSize == 0)
		{
			return null;
		}

		StringBuilder orderBy = new StringBuilder();
		Iterator<Map.Entry<String, SortKind>> iterator = orderByMap.entrySet().iterator();
		while (iterator.hasNext())
		{
			Map.Entry<String, SortKind> entry = iterator.next();
			orderBy.append(entry.getKey()).append(" ").append(entry.getValue());

			if (iterator.hasNext())
			{
				orderBy.append(",");
			}
		}

		return orderBy.toString();
	}
	
	/**
	 * データダンプ
	 * 
	 * @return ダンプデータ
	 */
	@Override
	public String toString()
	{
		return orderByMap.toString();
	}
}
